/**
 * 流程图生成指导类
 * 
 * 专门负责流程图的生成指导和API流程图的标准化处理。提供完整的
 * 流程图绘制规范、动态尺寸计算和样式要求。
 * 
 * 核心功能：
 * 1. API流程图生成 - 基于API路径自动生成标准流程结构
 * 2. 动态尺寸计算 - 根据流程复杂度计算合适的页面尺寸
 * 3. 样式规范指导 - 提供统一的流程图样式标准
 * 4. 理解确认机制 - 确保大模型充分理解业务流程
 * 5. 详细程度控制 - 指导生成详细完整的流程图
 */
export class FlowchartGuide {
  
  async getGuidelines(diagramType: string, context?: string): Promise<any> {
    try {
      let guidelines = '';
      
      switch (diagramType) {
        case 'flowchart':
          guidelines = this.getFlowchartGuidelines(context);
          break;
        case 'architecture':
          guidelines = this.getArchitectureGuidelines(context);
          break;
        case 'sequence':
          guidelines = this.getSequenceGuidelines(context);
          break;
        case 'class':
          guidelines = this.getClassGuidelines(context);
          break;
        case 'component':
          guidelines = this.getComponentGuidelines(context);
          break;
        default:
          guidelines = this.getGeneralGuidelines();
      }
      
      return {
        content: [
          {
            type: 'text',
            text: guidelines
          }
        ]
      };
    } catch (error) {
      return {
        content: [
          {
            type: 'text',
            text: `获取绘图指导失败: ${error instanceof Error ? error.message : String(error)}`
          }
        ]
      };
    }
  }

  async generateApiFlowDiagram(apiPath: string, description?: string, moduleName?: string): Promise<any> {
    try {
      // 从API路径提取模块名
      const extractedModule = moduleName || this.extractModuleFromApiPath(apiPath);
      
      const flowDiagram = this.generateApiFlowStructure(apiPath, description, extractedModule);
      
      return {
        content: [
          {
            type: 'text',
            text: `# API流程图生成指导\n\n## API信息\n- **路径**: ${apiPath}\n- **模块**: ${extractedModule}\n- **描述**: ${description || '未提供'}\n\n## 建议的流程图结构\n\n${flowDiagram}\n\n## 绘制指导\n\n请根据上述结构，使用Draw.io创建流程图，注意：\n\n1. **起始节点**：使用椭圆形，浅绿色填充 (#d5e8d4)\n2. **处理节点**：使用矩形，浅蓝色填充 (#dae8fc)\n3. **决策节点**：使用菱形，浅黄色填充 (#fff2cc)\n4. **结束节点**：使用椭圆形，浅红色填充 (#f8cecc)\n5. **连接线**：使用黑色实线，箭头指向下一步\n\n## 推荐文件名\n\`${extractedModule}_api_flow_v1.0_${this.getCurrentDate()}.drawio\``
          }
        ]
      };
    } catch (error) {
      return {
        content: [
          {
            type: 'text',
            text: `生成API流程图失败: ${error instanceof Error ? error.message : String(error)}`
          }
        ]
      };
    }
  }

  private calculateFlowchartDimensions(context?: string): {
    pageWidth: number;
    pageHeight: number;
    nodeSpacing: number;
    levelSpacing: number;
  } {
    // 基于上下文估算流程图复杂度
    const contextLength = context ? context.length : 0;
    const estimatedNodes = Math.max(5, Math.min(20, Math.floor(contextLength / 50))); // 估算节点数量
    const estimatedLevels = Math.max(3, Math.ceil(estimatedNodes / 4)); // 估算层级数量
    
    const nodeSpacing = 200; // 节点间距
    const levelSpacing = 150; // 层级间距
    const nodeWidth = 120; // 节点宽度
    const nodeHeight = 60; // 节点高度
    const margin = 100; // 边距
    
    // 计算页面尺寸
    const nodesPerLevel = Math.ceil(estimatedNodes / estimatedLevels);
    const pageWidth = Math.max(1200, nodesPerLevel * nodeSpacing + margin * 2);
    const pageHeight = Math.max(800, estimatedLevels * levelSpacing + margin * 2);
    
    return {
      pageWidth,
      pageHeight,
      nodeSpacing,
      levelSpacing
    };
  }

  private getFlowchartGuidelines(context?: string): string {
    // 计算动态尺寸
    const dimensions = this.calculateFlowchartDimensions(context);
    
    return `# 流程图绘制指导

## 📐 动态尺寸计算 (确保布局充足)

### 🎯 智能尺寸建议
基于流程复杂度分析，推荐以下尺寸设置：

- **页面宽度**: ${dimensions.pageWidth}px
- **页面高度**: ${dimensions.pageHeight}px
- **节点间距**: ${dimensions.nodeSpacing}px
- **层级间距**: ${dimensions.levelSpacing}px

### 📏 Draw.io XML配置
\`\`\`xml
<mxGraphModel dx="${Math.round(dimensions.pageWidth * 0.8)}" dy="${Math.round(dimensions.pageHeight * 0.8)}" 
             pageWidth="${dimensions.pageWidth}" pageHeight="${dimensions.pageHeight}">
\`\`\`

### ⚠️ 布局优化提醒
- 复杂流程图需要足够的空间避免重叠
- 预留边距确保所有节点完全可见
- 决策分支需要额外的水平空间

---

## 🧠 第一步：理解确认 (必须完成)

⚠️ **重要提醒**：在开始绘制流程图之前，请大模型先完成以下理解确认步骤：

### 📋 理解确认清单
请大模型按照自己的理解，用自然语言总结以下内容：

1. **业务流程理解**
   - 这个流程图要描述什么业务场景？
   - 流程的主要目标和预期结果是什么？
   - 涉及哪些角色或系统？

2. **流程步骤分析**
   - 流程的起点和终点是什么？
   - 有哪些主要的处理步骤？
   - 是否包含决策点和分支逻辑？
   - 是否有并行处理或循环？

3. **异常处理确认**
   - 是否需要包含错误处理分支？
   - 有哪些可能的异常情况？
   - 异常发生时的处理流程是什么？

4. **完整性检查**
   - 流程是否覆盖了所有必要的步骤？
   - 是否遗漏了重要的验证或检查点？
   - 流程的逻辑是否清晰合理？

5. **🎯 详细程度要求 (重要)**
   - **必须详细展示每个步骤**：不能省略中间环节，每个重要操作都要体现
   - **必须包含错误处理**：正常流程和异常流程都要完整展示
   - **必须体现数据验证**：输入验证、业务规则检查等要明确标注
   - **必须标注决策逻辑**：每个判断条件都要清楚表达
   - **必须包含循环处理**：如果有循环逻辑，要明确标注循环条件和退出条件
   - **必须显示并发分支**：如果有并行处理，要用分支明确表示
   - **必须补充业务细节**：不仅要有技术流程，还要体现业务逻辑
   - **必须标注关键节点**：重要的状态变更、数据持久化要特别标注

### ✅ 确认完成标志
请在理解确认完成后，明确说明：
- "我已理解业务流程的目标和范围"
- "我确认已识别所有关键步骤和决策点"
- "我准备开始按照规范绘制流程图"

---

## 基本原则
1. **从上到下**：流程应该从上到下流动
2. **清晰标注**：每个步骤都要有清晰的标注
3. **决策点明确**：使用菱形表示决策点
4. **统一样式**：保持颜色和形状的一致性

## 标准组件样式
- **开始/结束**：椭圆形，浅绿色 (#d5e8d4) / 浅红色 (#f8cecc)
- **处理步骤**：矩形，浅蓝色 (#dae8fc)
- **决策判断**：菱形，浅黄色 (#fff2cc)
- **数据存储**：圆角矩形，浅灰色 (#f5f5f5)

## 连接线规范
- 使用黑色实线，线宽1px（默认，避免粗线）
- 箭头指向明确
- 决策分支要标注条件（是/否）
- 自环线使用弯曲路径，避免与其他线条重叠

## 布局建议
- 组件间距：垂直间距50px，水平间距100px
- 文字大小：12-14px
- 边框：统一使用1px黑色边框

${context ? `\n## 针对场景的建议\n${this.getContextSpecificAdvice(context, 'flowchart')}` : ''}`;
  }

  private getArchitectureGuidelines(context?: string): string {
    return `# 架构图绘制指导

## 设计原则
1. **分层清晰**：按照系统层次从上到下排列
2. **模块分组**：相关模块用虚线框分组
3. **数据流向**：用箭头表示数据流向
4. **接口标注**：清楚标注接口和协议

## 标准组件样式
- **用户界面**：浅蓝色矩形 (#dae8fc)
- **业务逻辑**：浅橙色矩形 (#ffe6cc)
- **数据层**：浅绿色矩形 (#d5e8d4)
- **外部系统**：浅灰色矩形 (#f5f5f5)

## 连接规范
- **API调用**：实线箭头，标注协议（HTTP/gRPC等）
- **数据流**：虚线箭头，标注数据类型
- **依赖关系**：点线箭头

${context ? `\n## 针对场景的建议\n${this.getContextSpecificAdvice(context, 'architecture')}` : ''}`;
  }

  private getSequenceGuidelines(context?: string): string {
    return `# 时序图绘制指导

## 重要提示
⚠️ **时序图绘制流程**：
1. 首先生成Mermaid时序图语法
2. 展示Mermaid图表给用户确认
3. 使用转换工具将Mermaid转换为Draw.io格式

## Mermaid时序图语法示例
\`\`\`mermaid
sequenceDiagram
    participant U as 用户
    participant S as 系统
    participant D as 数据库
    
    U->>S: 发送请求
    S->>D: 查询数据
    D-->>S: 返回结果
    S-->>U: 响应数据
\`\`\`

## Draw.io转换要点
- **参与者**：使用矩形，顶部对齐
- **生命线**：垂直虚线
- **消息**：水平箭头，标注消息内容
- **激活框**：在生命线上的矩形框

${context ? `\n## 针对场景的建议\n${this.getContextSpecificAdvice(context, 'sequence')}` : ''}`;
  }

  private getClassGuidelines(context?: string): string {
    return `# 类图绘制指导

## 基本结构
1. **类名**：顶部，粗体
2. **属性**：中间部分，- private, + public
3. **方法**：底部，同样使用访问修饰符

## 样式规范
- **普通类**：浅蓝色 (#dae8fc)
- **抽象类**：浅黄色 (#fff2cc)，斜体类名
- **接口**：浅绿色 (#d5e8d4)，<<interface>>标注

## 关系表示
- **继承**：空心三角箭头
- **实现**：虚线空心三角箭头
- **关联**：实线箭头
- **依赖**：虚线箭头

${context ? `\n## 针对场景的建议\n${this.getContextSpecificAdvice(context, 'class')}` : ''}`;
  }

  private getComponentGuidelines(context?: string): string {
    return `# 组件图绘制指导

## 组件表示
- **组件**：矩形，带有组件图标
- **接口**：圆形或棒棒糖符号
- **端口**：小方块

## 样式规范
- **核心组件**：浅蓝色 (#dae8fc)
- **外部组件**：浅灰色 (#f5f5f5)
- **接口**：白色圆形

## 连接关系
- **依赖**：虚线箭头
- **接口实现**：实线连接到接口
- **组件通信**：双向箭头

${context ? `\n## 针对场景的建议\n${this.getContextSpecificAdvice(context, 'component')}` : ''}`;
  }

  private getGeneralGuidelines(): string {
    return `# 通用绘图指导

## 基本原则
1. **简洁明了**：避免过于复杂的图表
2. **一致性**：保持样式和命名的一致性
3. **可读性**：确保文字清晰可读
4. **逻辑性**：流程要符合逻辑

## 通用样式
- **标题**：16px，粗体，居中
- **正文**：12px，常规字体
- **边框**：1px黑色实线
- **背景**：根据组件类型选择合适颜色

## 文件管理
- 统一存放在 ./drawio 目录
- 按照命名规范命名文件
- 及时更新版本号`;
  }

  private getContextSpecificAdvice(context: string, diagramType: string): string {
    // 根据上下文和图表类型提供具体建议
    if (context.includes('API') || context.includes('接口')) {
      return `**API相关建议**：
- 明确标注HTTP方法和状态码
- 显示请求/响应数据格式
- 包含错误处理流程`;
    }
    
    if (context.includes('数据库') || context.includes('存储')) {
      return `**数据相关建议**：
- 标注数据流向
- 显示数据格式转换
- 包含数据验证步骤`;
    }
    
    return `**通用建议**：根据具体业务场景调整图表细节，确保关键信息清晰可见。`;
  }

  private extractModuleFromApiPath(apiPath: string): string {
    // 从API路径提取模块名
    const pathParts = apiPath.split('/').filter(part => part.length > 0);
    
    if (pathParts.length >= 2) {
      return pathParts[1]; // 通常第二部分是模块名
    }
    
    return pathParts[0] || 'api';
  }

  private generateApiFlowStructure(apiPath: string, description?: string, moduleName?: string): string {
    return `### 建议的API流程结构

1. **开始** → 用户发起API请求
   ↓
2. **验证** → 请求参数验证
   ↓
3. **认证** → 用户身份认证
   ↓
4. **业务处理** → ${description || '执行核心业务逻辑'}
   ↓
5. **数据操作** → 数据库读写操作
   ↓
6. **响应构建** → 构建API响应
   ↓
7. **结束** → 返回响应给用户

### 错误处理分支
- 参数验证失败 → 返回400错误
- 认证失败 → 返回401错误
- 业务逻辑错误 → 返回500错误
- 数据操作失败 → 返回500错误`;
  }

  private getCurrentDate(): string {
    const now = new Date();
    const year = now.getFullYear();
    const month = String(now.getMonth() + 1).padStart(2, '0');
    const day = String(now.getDate()).padStart(2, '0');
    return `${year}${month}${day}`;
  }
}
